package com.xcdh.commons.utils;

import com.xcdh.commons.spring.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

public class RestTemplateUtil {

    private static RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);

    /**
     * 发送 GET 请求
     *
     * @param url 请求地址
     * @param responseType 返回类型
     * @param uriVariables URL 参数
     * @return 响应结果
     */
    public static  <T> T get(String url, Class<T> responseType, Map<String, ?> uriVariables) {
        return restTemplate.getForObject(url, responseType, uriVariables);
    }

    /**
     * 发送 GET 请求（带请求头）
     *
     * @param url 请求地址
     * @param headers 请求头
     * @param responseType 返回类型
     * @param uriVariables URL 参数
     * @return 响应结果
     */
    public static <T> T get(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {
        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
        ResponseEntity<T> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
        return response.getBody();
    }

    /**
     * 发送 POST 请求
     *
     * @param url 请求地址
     * @param requestBody 请求体
     * @param responseType 返回类型
     * @param uriVariables URL 参数
     * @return 响应结果
     */
    public static <T> T post(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {
        return restTemplate.postForObject(url, requestBody, responseType, uriVariables);
    }

    public static <T> T post(String url, Object requestBody, Class<T> responseType) {
        return restTemplate.postForObject(url, requestBody, responseType, new HashMap<>());
    }

    /**
     * 发送 POST 请求（带请求头）
     *
     * @param url 请求地址
     * @param headers 请求头
     * @param requestBody 请求体
     * @param responseType 返回类型
     * @param uriVariables URL 参数
     * @return 响应结果
     */
    public static <T> T post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {
        HttpEntity<?> requestEntity = new HttpEntity<>(requestBody, headers);
        ResponseEntity<T> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);
        return response.getBody();
    }

    /**
     * 发送 PUT 请求
     *
     * @param url 请求地址
     * @param requestBody 请求体
     * @param uriVariables URL 参数
     */
    public static void put(String url, Object requestBody, Map<String, ?> uriVariables) {
        restTemplate.put(url, requestBody, uriVariables);
    }

    /**
     * 发送 DELETE 请求
     *
     * @param url 请求地址
     * @param uriVariables URL 参数
     */
    public static void delete(String url, Map<String, ?> uriVariables) {
        restTemplate.delete(url, uriVariables);
    }

    /**
     * 发送通用请求
     *
     * @param url 请求地址
     * @param method 请求方法
     * @param headers 请求头
     * @param requestBody 请求体
     * @param responseType 返回类型
     * @param uriVariables URL 参数
     * @return 响应结果
     */
    public static <T> T exchange(String url, HttpMethod method, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {
        HttpEntity<?> requestEntity = new HttpEntity<>(requestBody, headers);
        ResponseEntity<T> response = restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);
        return response.getBody();
    }
}
